// 引入express模块
const express = require("express")
// 实例化express模块
const app = express()

// 引入cors,解决跨域
const cors = require("cors")
app.use(cors({
    // 暴露响应头给前端
    exposedHeaders: "Authorization"
}))

// 托管静态资源目录
app.use(express.static("public"))

// 当post请求的参数为json时,必须配置json中间件
app.use(express.json())

// 引入JWT,用于生成-校验token
const JWT = require("./utils/jwt")
// 注册校验token的中间件
app.use((req, res, next) => {
    // 对login接口放行
    if (req.url === "/login") return next()
    // 获取前端设置在请求头Authorization的token加密信息
    const token = req.headers["authorization"]
    // 如果传递了token
    if (token) {
        // 获取解密的token
        const decode = JWT.verify(token)
        // 校验通过
        if (decode) {
            // 刷新token的过期时间，生成新的token
            const newToken = JWT.sign({
                _id: decode._id,
                username: decode.username
            }, "1h")
            res.setHeader("Authorization", newToken)
            return next()
        }
    } else {
        // 校验失败或token过期
        res.send({
            code: "401",
            msg: "token无效",
            data: null
        })
    }
})

// 引入链接数据库的方法
require("./config")

// 引入所有接口
const router = require("./router/index")

// 挂载路由中间件
app.use("/", ...router)

// 错误拦截
app.use((err, req, res, next) => {
    console.log(err, "-------------");
    next()
})
// 端口号   
const port = 8903
// 监听服务
app.listen(port, () => {
    console.log("server is running 127.0.0.1:8903");
})

